package com.xzh.testDemo;


import com.xzh.spring.AnnotationConfigApplicationContext;
import com.xzh.testDemo.service.OrderService;
import com.xzh.testDemo.service.UserService;
import com.xzh.testDemo.service.impl.UserServiceImpl;

public class AppStart {
    public static void main(String[] args) {

//        test_01();
//        test_02();
//        test_03();
//        test_04()
//        test_05();
//        test_06();
//        test_07();
        test_08();
    }

    /**
     * 测试第一部分：启动时依赖装配
     * 结果：已经实现了单例、原型bean的创建，与包扫描+注册的功能
     */
    public static void test_01() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        System.out.println(context.getBean("userService"));
        System.out.println(context.getBean("userService"));
        System.out.println(context.getBean("user"));
        System.out.println(context.getBean("user"));


    }


    /**
     * 测试第二部分：实现@AutoWired 自动装配
     * 条件：user单例  userService单例
     * 结果：调用userService中调用user的方法成功，后面再get user user地址一样
     */
    public static void test_02() {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService = (UserService) context.getBean("userService");
        userService.test();

        System.out.println(context.getBean("user"));
    }


    /**
     * 测试第三部分：实现Aware
     * 条件：UserServiceImpl实现BeanNameAware接口、
     * 新加private String beanName;  并且实现对beanName赋值的方法
     * 结果：成功显示beanName
     */
    public static void test_03() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService = (UserService) context.getBean("userService");
        userService.test();

    }

    /**
     * 测试第四部分：实现InitializeBean
     * 条件：UserServiceImpl实现InitializeBean接口、并且实现afterPropertiesSet方法
     * 并且不调用任何方法，观察输出
     * 结果：afterPropertiesSet方法被执行了，成功
     */
    public static void test_04() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService = (UserService) context.getBean("userService");

    }

    /**
     * 测试第五部分：实现BeanPostProcessor
     * 条件：创建一个新类TestBeanPostProcessor 实现实现BeanPostProcessor
     * 并且不调用任何方法，观察输出
     * 结果：每个bean都执行了BeanPostProcessor中的方法 并且实现了针对于某个bean的额外操作
     */
    public static void test_05() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//        UserService userService = (UserService) context.getBean("userService");

    }


    /**
     * 测试第六部分：实现二级缓存
     * 条件：创建OrderServiceImpl调用UserServiceImpl；在UserServiceImpl中调用OrderServiceImpl
     * 这样就会发生循环依赖问题
     * 结果：成功解决循环依赖
     */
    public static void test_06() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        OrderService orderService = (OrderService) context.getBean("orderService");
        orderService.runOtherClass();
        System.out.println(context.getBean("userService"));
    }

    /**
     * 测试第七部分：实现AOP
     * 条件：创建TimeAdvice 给指定方法添加前置、后置增强
     *
     * 结果：测试成功，但存在循环依赖问题：调用userService.test()，在其方法中调用userService.test()，并且userService.test()已经添加@Before
     * 但是结果却丢失了@Before,说明执行的那个bean不是代理bean
     */
    public static void test_07() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService = (UserService) context.getBean("userService");
        userService.test();
    }

    /**
     * 测试第八部分：实现三级缓存
     * 条件：
     *
     * 结果：测试成功，解决了循环依赖问题
     */
    public static void test_08() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService = (UserService) context.getBean("userService");
        OrderService orderService = (OrderService) context.getBean("orderService");
        userService.test();
        orderService.test();


    }

}
